// this header inclues all the necessary D3D10 includes
//#include <dynlink_d3d10.h>
#pragma once
#include <DXUT/DXUT.h>
#include <cuda.h>
#include <builtin_types.h>
#include <cuda_runtime_api.h>

#define clampValue(x,y,z) x<y?y:x>z?z:x

typedef D3DXVECTOR4 Vector4;
typedef D3DXMATRIX Matrix;

typedef int IndexT;

// testing/tracing function used pervasively in tests.  if the condition is unsatisfied
// then spew and fail the function immediately (doing no cleanup)
#define AssertOrQuit(x) \
	if (!(x)) \
{ \
	fprintf(stdout, "Assert unsatisfied in %s at %s:%d\n", __FUNCTION__, __FILE__, __LINE__); \
	system("PAUSE"); \
	exit(1); \
}

// Remplazamos el cutilCheckError para que pause la aplicacion
// antes de exit(-1);
#ifdef _DEBUG
#define cudaCheckMsg(err)         __myCudaCheckMsg   (err, __FILE__, __LINE__)
#else
#define cudaCheckMsg	
#endif
inline void __myCudaCheckMsg( const char *errorMessage, const char *file, const int line )
{
	cudaError_t err = cudaGetLastError();
	if( cudaSuccess != err) {
		fprintf(stderr, "cudaCheckMsg() CUTIL CUDA error: %s in file <%s>, line %i : %s.\n",
			errorMessage, file, line, cudaGetErrorString(err));
		system("PAUSE");
		exit(-1);
	}
}

// Una estructura contenedora que almacena tanto la direccion del buffer
// en memoria de video como la cantidad de elementos en el.
struct deviceBuffer 
{
	// Constructor
	deviceBuffer(ID3D10Buffer *buffer, int itemCount)
	{
		this->buffer = buffer;
		this->itemCount = itemCount;
	}

	// Apuntador al buffer en memoria de video.
	ID3D10Buffer *buffer;

	// Cantidad de items en el buffer.
	int itemCount;
};

struct ui4
{
    unsigned int x, y, z, w;
};

struct f4
{
    float x, y, z, w;
};

// Union para almacenar los inidices en un float4.
union IntFloat4
{
	// Interpret the values as ints.
    ui4 i;
	// Interpret the values as floats.
    f4 f;
};

typedef D3DXVECTOR4 Vector4;
typedef D3DXMATRIX Matrix;

/*!
 * \brief
 * Estructora utilizada para almacenar el estado del mouse en
 * un instante dado.
 * 
 * \remarks
 * Los valores del MouseWheel delta se pasan al evento por separado.
 */
struct mouseState
{
    bool left, right, middle;
    bool x, y;
};
